package simple.number;

/**
 * <a href="https://leetcode-cn.com/problems/power-of-two/">231. 2 的幂</a>
 * 给你一个整数 n，请你判断该整数是否是 2 的幂次方。如果是，返回 true ；否则，返回 false 。
 * 如果存在一个整数 x 使得 n == 2x ，则认为 n 是 2 的幂次方。
 * 示例 1：
 *   输入：n = 1
 *   输出：true
 *   解释：20 = 1
 * 示例 2：
 *   输入：n = 16
 *   输出：true
 *   解释：24 = 16
 * 示例 3：
 *   输入：n = 3
 *   输出：false
 * 示例 4：
 *   输入：n = 4
 *   输出：true
 * 示例 5：
 *   输入：n = 5
 *   输出：false
 * 提示：
 *   -231 <= n <= 231 - 1
 * @author 刘学松
 * @date 2022-04-12 18:44
 */
public class 二的幂 {
    /**
     * 该位运算技巧可以直接将 n 二进制表示的最低位 1 移除
     * @param n
     * @return
     */
    public boolean isPowerOfTwo(int n) {
        return (n & (n - 1)) == 0;
    }

    /**
     * 其中 -n 是 n 的相反数，是一个负数。该位运算技巧可以直接获取 n 二进制表示的最低位的 1。
     * @param n
     * @return
     */
    public boolean isPowerOfTwo2(int n) {
        return (n & (-n)) == n;
    }
}
